#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:taotieren


"""
    rpi.gpio 需要 root 权限，板上运行需要使用
    sudo python servo.py
    控制伺服电机旋转角度 0~180 度
    更多伺服电机控制驱动参考：
    https://github.com/richardghirst/PiBits
    https://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code
"""

""" python3 中请安装 tkintertoy 来进行程序调试和验证 """
from tkinter import *

""" 非树莓派环境下可以用 rpi.gpio_def 代替 rpi.gpio 来进行程序调试和验证 """
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)
"""
    PWM 频率：100HZ
    也就是 10ms 一个脉冲
    伺服角度将转换为 0~100 之间的一个占空系数
"""
pwm = GPIO.PWM(18, 100)
pwm.start(100)


class App:

    def __init__(self, master):
        frame = Frame(master)
        frame.pack()
        scale = Scale(frame, from_=0, to=180,
                      orient=HORIZONTAL,
                      command=self.update)
        scale.grid(row=0)

    def update(self, angle):
        """
            多次实验后的优化算法，能够让伺服电机旋转角度接近 180 度
            duty = int(float(angle) * 500.0 / 180.0) +110
            为了更好的对比没有删除原文件
            在 if 处使用 0 / 1 来选择角度控制算法
            默认使用优化后的算法
        """
        if 0:
            duty = float(angle) / 10.0 + 2.5
        else:
            duty = int(float(angle) * 500.0 / 180.0) + 110
        pwm.ChangeDutyCycle(float(duty))


root = Tk()
root.wm_title('Servo Control')
app = App(root)
root.geometry("200x50+0+0")
root.mainloop()
